package com.example.leetcode.problem.isuniquelcci;

import org.springframework.util.Assert;

public class IsUniquelcci {

    /**
     * 思路
     * 由于ASCII码字符个数为128个，而且题目说了如果你不使用额外的数据结构，会很加分。因此可以使用两个64位的long变量来存储是否出现某个字符，二进制位1表示出现过， 0表示未出现过。具体代码如下
     * <p>
     * 作者：yuruiyin
     * 链接：https://leetcode-cn.com/problems/is-unique-lcci/solution/java-wei-yun-suan-by-npe_tle-2/
     * 来源：力扣（LeetCode）
     * 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
     * <p>
     * <p>
     * 2.位运算概览
     * 符号	描述	运算规则
     * &	与	两个位都为1时，结果才为1
     * |	或	两个位都为0时，结果才为0
     * ^	异或	两个位相同为0，相异为1
     * ~	取反	0变1，1变0
     * <<	左移	各二进位全部左移若干位，高位丢弃，低位补0
     * >>	右移	各二进位全部右移若干位，对无符号数，高位补0，有符号数，各编译器处理方法不一样，有的补符号位（算术右移），有的补0（逻辑右移）
     *
     * @param astr
     * @return
     */
    public boolean isUnique(String astr) {
        long low64 = 0;
        long high64 = 0;

        for (char c : astr.toCharArray()) {
            if (c >= 64) {
                long bitIndex = 1L << (c - 64);
                //bitIndex 二进制 1左移44位  100000000000000000000000000000000000000000000
                // high64  000000000000000000000000000000000000000000000
                //  所有位都相同 结果是1 return false
                if ((high64 & bitIndex) != 0) {
                    return false;
                }
                // 或操作 后二进制结果  100000000000000000000000000000000000000000000 把1的坑位成功站住
                high64 |= bitIndex;
            } else {
                long bitIndex = 1L << c;
                if ((low64 & bitIndex) != 0) {
                    return false;
                }
                low64 |= bitIndex;
            }
        }
        return true;
    }

    /**
     * 面试题 01.01. 判定字符是否唯一
     * 实现一个算法，确定一个字符串 s 的所有字符是否全都不同。
     * <p>
     * 示例 1：
     * <p>
     * 输入: s = "leetcode"
     * 输出: false
     * 示例 2：
     * <p>
     * 输入: s = "abc"
     * 输出: true
     * 限制：
     * <p>
     * 0 <= len(s) <= 100
     * 如果你不使用额外的数据结构，会很加分。
     *
     * @param args
     */
    public static void main(String[] args) {
        System.out.println("100000000000000000000000000000000000000000000".length());
        IsUniquelcci test = new IsUniquelcci();
        Assert.isTrue(!test.isUnique("leetcode"));
        Assert.isTrue(test.isUnique("abc"));
    }

//
//    作者：yuruiyin
//    链接：https://leetcode-cn.com/problems/is-unique-lcci/solution/java-wei-yun-suan-by-npe_tle-2/
//    来源：力扣（LeetCode）
//    著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
}
